void main() {
  // 列表泛型
  List<String> list = ['张三', '李四'];
  // list.add(true);  // 有泛型的约束，不能添加 String 以外的类型
  print(list);

  // 字典泛型，注意 dart 不支持联合类型，两种类型以上需用 dynamic 表示
  Map<String, dynamic> person = {
    'name': '张三',
    'gender': '男',
    // 'age': 18  // 有泛型的约束，不能添加 String 以外的类型
  };
  print(person);

  // 调用函数，传入不同类型
  var a = demo<int>(123);
  var b = demo('你好');
  var c = demo(true);

  // !!有了泛型的约束，函数返回值类型明确，调用时有代码提示和类型检查
  print(a.toDouble());
  print(b.length);
  print(c);
}

// 函数参数和返回值没有指定类型，书写时不会报错，但是运行时存在风险
// demo(value) {
//   return value;
// }

// 通过泛型参数，可确定 参数类型、返回值的类型
T demo<T>(T value) {
  return value;
}